#pragma once

#include "../Main/Standard.h"

////////////////////////////////////////////////////////////////////////////////////////////////////
/// <Summary>	ClockSystem  </Summary>
/// 
/// <purpose>	A high peformance clock for accurate time data	</purpose>
////////////////////////////////////////////////////////////////////////////////////////////////////

class ClockSystem
{
	/// <Summary> The start time </Summary>
	LARGE_INTEGER start;
	/// <Summary> The end time </Summary>
	LARGE_INTEGER end;
	/// <Summary> The frequency </Summary>
	LARGE_INTEGER frequency;

	/// <Summary> Time occuring in between Start and End </Summary>
	double deltaTime;
	/// <Summary> Total time since last Reset </Summary>
	double totalTime;

private:

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// <Summary>	Makes copy and assignment unavailable to this class </Summary>
	////////////////////////////////////////////////////////////////////////////////////////////////////
	DISALLOW_COPY_AND_ASSIGN(ClockSystem)

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// <Summary>	Constructor </Summary>
	////////////////////////////////////////////////////////////////////////////////////////////////////
	ClockSystem();

	/// <Summary> The instance of this class </Summary>
	static ClockSystem* instance;

public:

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// <Summary>	Gets the instance of this class </Summary>
	///
	/// <Return>	The instance of this class </Return>
	////////////////////////////////////////////////////////////////////////////////////////////////////
	static ClockSystem& GetInstance();

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// <Summary>	Deletes the instance of this class </Summary>
	////////////////////////////////////////////////////////////////////////////////////////////////////
	static void DeleteInstance();
	
public:

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// <Summary>	FrameStart	</Summary>
	///
	/// <Remarks>	
	///		This function begins the timer and must be called before End
	///	</Remarks>
	////////////////////////////////////////////////////////////////////////////////////////////////////
	void FrameStart();

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// <Summary>	FrameEnd	</Summary>
	///
	/// <Remarks>	
	///		This function stops the timer and must be called after Start. The delta value will
	///		be saved when this function is called.
	///	</Remarks>
	////////////////////////////////////////////////////////////////////////////////////////////////////
	void FrameEnd();

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// <Summary>	Reset	</Summary>
	////////////////////////////////////////////////////////////////////////////////////////////////////
	void Reset();

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// <Summary>	Get Delta Time	</Summary>
	///
	/// <Return>	The Delta Time since last call to End	</Return>
	////////////////////////////////////////////////////////////////////////////////////////////////////
	double GetDeltaTime() { return deltaTime; }
	float GetDeltaTimeF() { return (float)deltaTime; }

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// <Summary>	Get Total Time	</Summary>
	///
	/// <Return>	The Total Time since last call to Reset	</Return>
	////////////////////////////////////////////////////////////////////////////////////////////////////
	double GetTotalTime() { return totalTime; }
	float GetTotalTimeF() { return (float)totalTime; }
};


/////////////////////////////////////////////////////////////////////////////////////////////
///<Filename>  	WinMain.cpp			<\Filename>
///<Date>      	01/27/2009			<\Date>      
///<Author>   	Marcus L. Barker	<\Author>   
///<Purpose>   	
///		This is the entry point of the game.
///<\Purpose>
/////////////////////////////////////////////////////////////////////////////////////////////
